#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <errno.h>
#include <string.h>

//int main()
//{
//    printf("ECHILD=%d\n", ECHILD);    
//    int cnt = 5;
//    while(cnt--)
//    {
//        printf("I am a father, pid=%d\n", getpid());
//        sleep(1);
//    }
//    printf("开始回收\n");
//    int status;
//    pid_t rid = wait(&status);
//    printf("rid=%d, status=%d\n", rid, status);
//    //测试当没有子进程回收时的场景
//    if(rid == -1)
//    {
//        if(errno == ECHILD)
//            printf("No child processes to wait for\n");
//        perror("wait");
//    }
//    return 0;
//}

//int main()
//{
//    int i = 0;
//    for(; i<150; ++i)
//    {
//        printf("%d: %s\n", i, strerror(i));
//    }
//    return 0;
//}

//int main()
//{
//    pid_t id = fork();
//    if(id == 0)
//    {
//        int cnt = 5;
//        while(cnt--)
//        {
//            printf("I am a childprocess, pid=%d\n", getpid());
//            sleep(1);
//        }
//        exit(2);
//    }
//    printf("The father is waiting for the child\n");
//    printf("begin...\n");
//    sleep(10);
//    int status;
//    pid_t rid = wait(&status);
//    printf("...end\n");
//    if(rid > 0)
//        printf("rid=%d, status=%d\n", rid, status);
//    return 0;
//}


int main()
{
    pid_t id = fork();
    if(id == 0)
    {
        pid_t iid = fork();
        if(iid == 0)
        {
            sleep(6);
            execl("/usr/bin/linux_logo", NULL);
        }
        int status;
        pid_t rrid = waitpid(iid, &status, 0);
        if(rrid == iid)
        {
            if(WIFEXITED(status))
                printf("wait iid_linux_logo succeeded, pid=%d, exit_code = %d\n", iid, WEXITSTATUS(status));
        }
    }
    else 
    {
        int stat;
        pid_t rid;
        while(1)
        {
            rid = waitpid(id, &stat, WNOHANG);
            if(rid > 0)
            {
                if(WIFEXITED(stat))
                    printf("wait id succeeded, id=%d, exit_code=%d\n", id, WEXITSTATUS(stat));
                break;
            }
            else if(rid == 0)
            {
                float x, y, z;
                for(x=1.5f; x>-1; x-=0.1f)
                {
                    for(y=-1.5f; y<1.5f; y+=0.04f)
                    {
                        z = x*x + y*y - 1;
                        if(z*z*z - x*x*x*y*y < 0.0f)
                            printf("\033[5;31m*\033[0m");
                        else
                            printf(" ");
                    }
                    usleep(150000);
                    printf("\n");
                }
            }
        }
    }
    return 0;
}
